package com.killer.filter;

import com.killer.view.MonitorContext;
import com.killer.view.MonitorData;
import com.killer.view.RequestContext;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * @author ：Killer
 * @date ：Created in 20-12-16 下午3:29
 * @description：${description}
 * @modified By：
 * @version: version
 */
@Activate(group = {"consumer"})
public class TpMonitorFilter implements Filter {
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        //获取方法名
        String methodName=RpcContext.getContext().getMethodName();
        //开始统计时间
        long startTime=System.currentTimeMillis();
        Result result = invoker.invoke(invocation);
        //请求结束时间
        long endTime=System.currentTimeMillis();
        //获取对应的监控数据
        MonitorData monitorData = MonitorContext.getMethodMonitorData(methodName);
        monitorData.setTotalRequest(monitorData.getTotalRequest()+1);
        //计算响应时间
        long responeTime=endTime-startTime;
        //构建请求信息对象
        RequestContext requestContext = new RequestContext(UUID.randomUUID().toString(), System.currentTimeMillis());
        //获取统计响应时间频次的表
        Map<Long, List<RequestContext>> timeMap=monitorData.getTimeMap();
        //查看这个响应时间是否已经存在
        List<RequestContext> requestContexts = timeMap.get(responeTime);
        if (requestContexts == null) {
            //如果该响应时间还没有统计,则初始化一个
            requestContexts = new ArrayList<RequestContext>();
        }
        //将该次请求添加进去
        requestContexts.add(requestContext);
        timeMap.put(responeTime, requestContexts);
        MonitorContext.setMethodMonitorData(methodName, monitorData);
        return result;
    }

}
